package j.util.jdbc.simple.core;

import j.util.New;
import j.util.jdbc.simple.core.operations.SimpleJdbcDeleteOperations;
import j.util.jdbc.simple.core.operations.SimpleJdbcInsertOperations;
import j.util.jdbc.simple.core.operations.SimpleJdbcQueryOperations;
import j.util.jdbc.simple.core.operations.SimpleJdbcUpdateOperations;
import j.util.jdbc.simple.metadata.MetaDataUtils;
import j.util.jdbc.simple.metadata.TableMetaData;

import java.util.Map;

/**
 * simpleJdbc包的元数据上下文信息，该实例被SimpleJdbcTemplate托管
 * @author 刘军海
 * @version Sep 12, 2011 8:56:16 PM
 *
 */
public class SimpleJdbcContext {

    public static final int ORACLE_PROVIDER = 1;
    public static final int MYSQL_PROVIDER = 2;
    public static final int MSSQL_PROVIDER = 3;

    private SimpleJdbcContext(){
        this.insert = new SimpleJdbcInsert();
        this.delete = new SimpleJdbcDelete();
        this.query = new SimpleJdbcQuery();
        this.update = new SimpleJdbcUpdate();
    }
    public static SimpleJdbcContext instance = new SimpleJdbcContext();

	/**
	 * 数据表元数据的map集合，key为class的名字，包括包名
	 */
	private Map<String,SQLData> map = New.map();
    private SimpleJdbcInsertOperations insert;
    //删除操作
    private SimpleJdbcDeleteOperations delete;
    //查询操作
    private SimpleJdbcQueryOperations query;
    //更新操作
    private SimpleJdbcUpdateOperations update;
	/**
	 * 根据实体的class对象获取其对应的表元数据对象
	 * 该方法为懒加载模式，在第一次访问时将解析，并放到map中
	 * @param clazz
	 * @return
	 */
	public static  <T> SQLData getSQLData(Class<T> clazz){
		String name = clazz.getName();
		SQLData sqlData = instance.map.get(name);
		if(null == sqlData){
			//库中还没有该元数据，创建之
			synchronized(SimpleJdbcContext.class){
				//双重检查
				if(!instance.map.containsKey(name)){
					TableMetaData tmd = MetaDataUtils.parseTableMetaData(clazz);
					sqlData = new SQLData(tmd);
                    instance.map.put(name, sqlData);
				}
			}
		}
		return sqlData;
	}

    /**
     * 获取数据源提供者,如mysql oracle sql server
     * @return
     */
    public static int getDbProvider(){
        return MSSQL_PROVIDER;
    }

    /**
     * 获取单实例插入操作
     * @return SimpleJdbcInsertOperations
     */
    public static SimpleJdbcInsertOperations getInsertInstance(){
        return instance.insert;
    }
    /**
     * 获取单实例删除操作
     * @return SimpleJdbcDeleteOperations
     */
    public static SimpleJdbcDeleteOperations getDeleteInstance(){
        return instance.delete;
    }
    /**
     * 获取单实例更新操作
     * @return SimpleJdbcDeleteOperations
     */
    public static SimpleJdbcUpdateOperations getUpdateInstance(){
        return instance.update;
    }
    /**
     * 获取单实例查询操作
     * @return SimpleJdbcQueryOperations
     */
    public static SimpleJdbcQueryOperations getQueryInstance(){
        return instance.query;
    }
}
